package com.wuliang.blog.configs;

import com.wuliang.blog.response.Result;
import com.wuliang.blog.utils.ClassUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Documentation;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.DocumentationCache;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.util.Date;
import java.util.List;

@Slf4j
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    /**
     * 读取配置文件中的应用名称
     */
    @Value("${spring.application.name}")
    private String applicationName;

    /**
     * 是否开启接口文档，测试服务器中此选项应为开启状态，但正是服务器环境应为关闭状态。
     */
    @Value("${swagger.enable}")
    private Boolean enableSwagger = false;

    @Resource(name = "resourceGroupCache")
    private DocumentationCache resourceGroupCache;

    /**
     * @return Swagger中的Docket
     */
    @Bean
    public Docket controllerAPI() {
//        如果开启Swagger接口文档的话
        if (enableSwagger) {
//            通过反射获取应用类中的包名
            List<String> basePackages = ClassUtils.getBasePackages();
//            或许手动拼一下也是可以的
            String controllerPackage = "com.wuliang.blog";
//            确定一下反射过来的完全限定包名的数量是不是等于1，也就意味着你.... 是不是开了两遍。
            if (basePackages.size() == 1) {
//                将完全限定包名中的 'package ' 删除一下，并接上 'controller' 的包名
                controllerPackage = basePackages.get(0).replaceAll("package ", "") + ".controller";
//                输出下日志
            } else {
                controllerPackage = basePackages.get(1).replaceAll("package ", "") + ".controller";
            }
            log.info("Scanner controller package was {}", controllerPackage);
//            然后根据应用名称和包名对Swagger进行初始化
            Docket docket = new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                    .groupName(applicationName)
                    .select()
                    .apis(RequestHandlerSelectors.basePackage(controllerPackage))
                    .paths(PathSelectors.any())
                    .build()
                    .directModelSubstitute(Timestamp.class, Date.class)
                    .directModelSubstitute(Result.class, Object.class);
            for (Documentation documentation : resourceGroupCache.all().values()) {
                System.out.println(documentation.getGroupName());
            }
            return docket;
        }
        return new Docket(DocumentationType.SWAGGER_2);
    }

    /**
     * @return 有关于系统的描述
     */
    public ApiInfo apiInfo() {
        return new ApiInfoBuilder().title("智控系统4.0").description("接口文档").version("4.0").build();
    }

}